package com.ittx.dzt.meione.util;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

/**
 * <p>
 *
 * </p>
 *
 * @author wl_code@163.com
 * @version 1.0
 * @date 2025/8/27
 */
@Slf4j
public class MeioneSignUtil {

	public static String HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception {
		byte[] data = encryptKey.getBytes(StandardCharsets.UTF_8);
		// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
		SecretKey secretKey = new SecretKeySpec(data, "HmacSHA1");
		// 生成一个指定 Mac 算法 的 Mac 对象
		Mac mac = Mac.getInstance("HmacSHA1");
		// 用给定密钥初始化 Mac 对象
		mac.init(secretKey);
		byte[] text = encryptText.getBytes(StandardCharsets.UTF_8);
		// 完成 Mac 操作
		return Hex.encodeHexString(mac.doFinal(text));
	}

	public static String createSign(Map<String, Object> params, String privateKey, String appId) {
		Set<String> sortedParams = new TreeSet<>(params.keySet());
		StringBuilder strB = new StringBuilder();
		// 排除sign和空值参数
		for (String key : sortedParams) {
			if ("sign".equalsIgnoreCase(key)) {
				continue;
			}
			if (params.get(key) != null && StrUtil.isNotEmpty(params.get(key).toString())) {
				strB.append(key).append("=").append(params.get(key)).append("&");
			}
		}
		String signStr1 = strB.toString().substring(0,strB.toString().lastIndexOf("&"))+privateKey;
		String sign = null;
		try {
			sign = HmacSHA1Encrypt(signStr1, appId).toLowerCase();
		} catch (Exception e) {
			log.error("签名失败");
		}
		return sign;
	}

}
